<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>Document</title>
</head>
<body>
	<script>
		// 双向数据绑定的原理：把对象的属性，拦截对象的属性，把每个属性使用Object.defineProperty转成setter和getter的形式，当属性值变化时执行setter,通知vue把数据重新渲染到页面
		var obj={
			str:'hello',
			mun:123,
			a:{
				b:1
			}
		}
		function render(){
			console.log('数据变化了，该重新渲染到页面了')
		}
		//定义一个观察者
		function observer(obj){
			if(typeof obj !=='object' || obj == null){
				return obj
			}
			
			//遍厉对象，把对象的每个属性添加一个监听
			for(let attr in obj){
				console.log(attr)
				//把每个属性转成getter和setter
				defineReactive(obj,attr,obj[attr])
			}
		}
		observer(obj);

		function defineReactive(data,key,value){
			Object.defineProperty(data,key,{
				get(){//获取属性时执行
					return value
				},
				set(newVal){//监听到属性值发生变化的时候执行
					render()
					value = newVal;
				}
			})
		}
		// obj.str = 'hh'
		// console.log(obj.str）
		obj.a.b = 789
		console.log(obj.a.b)
	</script>
</body>
</html>